#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Word文档格式诊断和修复工具
用于处理格式问题和文件损坏的Word文档
"""

import os
import sys
import argparse
import subprocess
import shutil
from pathlib import Path
# import magic  # 不需要这个库
import docx2txt
from word2md import Word2MarkdownConverter


class DocumentFormatFixer:
    """文档格式诊断和修复工具"""
    
    def __init__(self):
        self.converter = Word2MarkdownConverter()
    
    def diagnose_file(self, file_path):
        """诊断文件格式和问题"""
        print(f"🔍 诊断文件: {file_path}")
        print("=" * 50)
        
        if not os.path.exists(file_path):
            print("❌ 文件不存在")
            return False
        
        # 基本信息
        file_size = os.path.getsize(file_path)
        print(f"📁 文件大小: {file_size:,} 字节")
        
        # 检查文件类型
        try:
            # 使用file命令检查文件类型
            result = subprocess.run(['file', file_path], 
                                  capture_output=True, text=True, timeout=10)
            file_type = result.stdout.strip()
            print(f"📝 文件类型: {file_type}")
        except Exception as e:
            print(f"⚠️  无法检测文件类型: {e}")
            file_type = ""
        
        # 判断真实格式
        is_old_doc = "Composite Document File" in file_type or "Microsoft Office Document" in file_type
        is_new_docx = "Microsoft Word 2007+" in file_type or "Zip archive data" in file_type
        
        print(f"📄 格式判断:")
        if is_old_doc:
            print("   ✅ 检测到旧版 .doc 格式")
            print("   💡 这是导致Pandoc错误的原因")
        elif is_new_docx:
            print("   ✅ 检测到新版 .docx 格式")
        else:
            print("   ⚠️  未知或损坏的文档格式")
        
        # 检查扩展名
        file_ext = Path(file_path).suffix.lower()
        print(f"🏷️  文件扩展名: {file_ext}")
        
        if is_old_doc and file_ext == '.docx':
            print("   ⚠️  格式不匹配：内容是.doc但扩展名是.docx")
            return 'format_mismatch'
        elif is_old_doc and file_ext == '.doc':
            print("   ✅ 格式匹配：.doc文件")
            return 'old_format'
        elif is_new_docx and file_ext == '.docx':
            print("   ✅ 格式匹配：.docx文件")
            return 'correct_format'
        else:
            print("   ❌ 格式异常或文件损坏")
            return 'corrupted'
    
    def extract_text_from_old_doc(self, file_path):
        """从旧版.doc文件提取文本"""
        try:
            print(f"📝 尝试从旧版文档提取文本...")
            
            # 使用docx2txt提取文本（虽然名字是docx2txt，但也能处理.doc）
            text = docx2txt.process(file_path)
            
            if text.strip():
                print(f"✅ 成功提取文本 ({len(text)} 字符)")
                return text
            else:
                print("⚠️  提取的文本为空")
                return None
                
        except Exception as e:
            print(f"❌ 文本提取失败: {e}")
            return None
    
    def convert_text_to_markdown(self, text, output_path):
        """将纯文本转换为简单的Markdown"""
        try:
            # 简单的文本到Markdown转换
            lines = text.split('\n')
            markdown_lines = []
            
            for line in lines:
                line = line.strip()
                if not line:
                    markdown_lines.append("")
                    continue
                
                # 简单的标题检测（全大写或较短的行可能是标题）
                if len(line) < 50 and (line.isupper() or 
                                     any(keyword in line.lower() for keyword in ['章', '节', '第', '标题', 'title', 'chapter'])):
                    markdown_lines.append(f"# {line}")
                else:
                    markdown_lines.append(line)
                
                markdown_lines.append("")
            
            # 写入文件
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write('\n'.join(markdown_lines))
            
            print(f"✅ Markdown文件已创建: {output_path}")
            return output_path
            
        except Exception as e:
            print(f"❌ Markdown转换失败: {e}")
            return None
    
    def fix_document(self, file_path, output_path=None):
        """修复文档格式问题"""
        print(f"\n🔧 开始修复文档: {file_path}")
        
        # 诊断文件
        diagnosis = self.diagnose_file(file_path)
        
        if diagnosis == 'correct_format':
            print("\n✅ 文件格式正确，尝试直接转换...")
            try:
                if output_path is None:
                    output_path = str(Path(file_path).with_suffix('.md'))
                return self.converter.convert_docx_to_markdown(file_path, output_path)
            except Exception as e:
                print(f"❌ 直接转换失败: {e}")
                return None
        
        elif diagnosis in ['old_format', 'format_mismatch']:
            print(f"\n🔄 处理旧版Word文档...")
            
            # 从旧文档提取文本
            text = self.extract_text_from_old_doc(file_path)
            
            if text:
                if output_path is None:
                    output_path = str(Path(file_path).with_suffix('.md'))
                
                return self.convert_text_to_markdown(text, output_path)
            else:
                print("❌ 无法从文档提取文本")
                return None
        
        else:
            print("❌ 文档损坏或格式不支持")
            return None
    
    def batch_fix(self, input_dir, output_dir=None):
        """批量修复目录中的文档"""
        input_path = Path(input_dir)
        
        if not input_path.exists():
            print(f"❌ 输入目录不存在: {input_dir}")
            return
        
        if output_dir is None:
            output_dir = input_dir
        
        output_path = Path(output_dir)
        output_path.mkdir(exist_ok=True)
        
        # 查找所有Word文档
        doc_files = list(input_path.glob("*.doc")) + list(input_path.glob("*.docx"))
        
        if not doc_files:
            print(f"❌ 在目录 {input_dir} 中未找到Word文档")
            return
        
        print(f"📁 找到 {len(doc_files)} 个文档待处理")
        
        success_count = 0
        for doc_file in doc_files:
            try:
                print(f"\n{'='*60}")
                output_file = output_path / f"{doc_file.stem}.md"
                result = self.fix_document(str(doc_file), str(output_file))
                if result:
                    success_count += 1
            except Exception as e:
                print(f"❌ 处理文件 {doc_file} 失败: {e}")
        
        print(f"\n🎉 批量处理完成，成功处理 {success_count}/{len(doc_files)} 个文件")


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="Word文档格式诊断和修复工具")
    parser.add_argument("input", help="输入的Word文档路径或目录")
    parser.add_argument("-o", "--output", help="输出文件或目录路径")
    parser.add_argument("-b", "--batch", action="store_true", help="批量处理模式")
    parser.add_argument("--diagnose-only", action="store_true", help="仅诊断，不转换")
    
    args = parser.parse_args()
    
    fixer = DocumentFormatFixer()
    
    try:
        if args.diagnose_only:
            # 仅诊断模式
            fixer.diagnose_file(args.input)
        elif args.batch:
            # 批量处理模式
            fixer.batch_fix(args.input, args.output)
        else:
            # 单文件处理模式
            result = fixer.fix_document(args.input, args.output)
            if result:
                print(f"\n🎉 处理完成: {result}")
            else:
                print("\n❌ 处理失败")
    
    except Exception as e:
        print(f"❌ 错误: {str(e)}")
        sys.exit(1)


if __name__ == "__main__":
    main() 